home *** CD-ROM | disk | FTP | other *** search
- HOW TO CRACK, by +ORC, A TUTORIAL
-
- ---------------------------------------------------------------------------
-
- Lesson 1: an approach
-
- ---------------------------------------------------------------------------
-
- [Pooldemo.exe]
-
- --------------------------------------
-
- The best way to learn cracking (i.e. understanding, broadly
- individuating, locating exactly and eliminating or suspending or
- deferring one or more protection schemes inside a software
- application you do not possess the source code of) is to begin
- your tampering experiments using OLDER applications which have
- OLDER protection schemes.
- In this way you 'll quickly grasp the base techniques of the
- trade. Do not forget that the evolution of the protection schemes
- has not been a one way road... strictly speaking it's not even
- an evolution: you'll eventually find some very clever new tricks,
- but most of the time you 'll unearth only various trite
- repetitions of past (and well known) tricks. This is no wonder:
- the REAL knowledge of the "commercial" programmers themselves
- (the "protectionists") is often very limited indeed: they are
- inclined to use the old methods (albeit somehow changed,
- sometimes even improved) instead of conceiving new methods. This
- typical "commercial" degeneration happens every time people act
- for money instead of doing things for the sake of it or for
- pleasure. This "commercial" trend is blindly encouraged by the
- stupid, money-oriented society we are coerced to live in.
- So I'll begin the "hands on" part (-> starting from lesson
- 3), using as examples, some "old" applications and some "old"
- tricks. We'll be able to come later over to the newest protection
- schemes in order to understand them, and you 'll learn how to
- defeat this kind of junk too. I'll also explain WHERE you can
- find a lot of programs to crack for next to no money at all, and
- HOW 'grossomodo', you should proceed in your work.
- This tutorial is for people who are getting started with
- cracking. Maybe you are just contemplating doing some cracking,
- maybe you have tried it with mixed success. If you are here to
- get aimed in the right direction, to get off to a good start with
- the cracking tricks and procedures, then you have come for the
- right reason. I can't promise you'll get what you want, but I'll
- do my best. On the other hand, if you have already turned out
- some working cracking code in assembler and already cracked many
- different protection schemes, then this tutorial is likely to be
- on the elementary side for you. (If you want to review a few
- basics and have no where else pressing to go, then by all means
- stay).
- In order to crack successfully you need four basic things:
- * A passing knowledge of assembler language (the more you
- know, the better and quicker you crack)
- * Some intuition
- * Some help from more experienced cracker
- * A non mercantile mind (more about this later)
- The applications you'll use to learn with can be divided into:
- 1 - Password crippled applications (the easiest to crack)
- 2 - applications crippled on how many times, or how many
- days, you use them (fairly easy to crack)
- 3 - applications crippled on which date you use them before
- (easy to crack)
- 4 - applications that have some functions present but
- disabled (sometimes easy, sometimes difficult)
- 5 - applications crippled on Disk access (protections schemes
- that are now defined as "obsolete") and applications
- crippled on
- CD-ROM presence (more or less the same methods, but -
- somehow- not defined as "obsolete") (very easy to crack)
- 6 - CRYPTOGRAFED ADDS ON (i.e. one of the previous protection
- schemes, but with some scrambled or self modifying code
- (XORring and SHRLing codes) (fairly easy to crack)
- 7 - None of the above (sometimes difficult to crack)
-
- WHERE TO GET THE STUFF
- The recent widespread appearance of "Demo"-CDROM on magazine
- covers is a treasure for all crackers! A short time after their
- release you 'll get all the copies that remain unsold for next
- to free. The demos on CD-ROMs will permit you to gather quickly
- a lot of applications -old and new- that have somehow been
- crippled (at times with interesting schemes). Truly a wonderful
- world of cracking possibilities! Gee! For next to no money you
- can secure on one CDROM the whole of LOTUS applications (or
- Microsoft or Wordperfect, or you name them) on "trial for 30
- days" or "try it 20 times" editions. You'll really enjoy to crack
- them, to use them for ever and ever and/or graciously donate them
- on the Web to the poor lamers that have no money and no brain.
- GAMES are definitely not to be frowned upon! They are
- very interesting from a cracker prospective coz they are often
- "overprotected". With this I mean that they possess protection
- schemes of a relatively HIGH level hidden inside files that are
- relatively small. Now, see, it is much more easy, and simple, to
- track down and eliminate protection schemes inside a single
- 35.000 bytes long executable file than to locate them inside a
- collection of many lengthy DLLs and overlaids that could have
- swollen as long as 2.000.000 bytes each. The lazy bunch of
- "modern" programmers relies systematically for protection schemes
- on this "hide the sting in the wide desert" logic. As a matter
- of fact they are no longer able to program in assembler: they
- bank more and more on overbloated "fatty" atrocities like Visual
- Basic, Delphy or Visual C++. (Don't worry... I'll nevertheless
- teach you how to crack -and quickly- those huge applications
- too).
- There is another reason for employing games instead of
- applications as study material: often EXACTLY THE SAME protection
- schemes that you find in a simple (and short) shareware game will
- be used -without much improving- a little later in order to
- "protect" some huge and extremely expensive graphic application.
- For this reason in my tutorial we'll often crack games
- protection schemes, even if we'll later apply what we learn
- mainly in order to crack the protection schemes of commercial
- applications, or to crack the access protection routines to
- remote servers, or BBS, or even ATM (cash dispensers).
- Here follows an example cracking session, that will show you
- -I hope- the dos and donts of our art: let's crack together as
- introductory example a time crippled application. We'll learn
- later (-> LESSON 4) that all applications that are crippled on
- time (i.e. "how many times" you use them or "how long" you use
- them) rely on analogous protection schemes (albeit with a huge
- palette of small variations):
- 1- they may have a counter which "clicks" every so often: FIND
- IT AND DISABLE IT!
- 2- they may fetch the time_clock interrupts in your machine:
- INTERCEPT THEM YOURSELF!
- 3- they may compare a random_seed with a variable: NOOP IT!
- 4- they may check randomly the date of your other, unrelated,
- files on the hard disk: find this verification routine and
- INVERT the JUMPS!
- I wanted to start with a modern example of this "counter clicks"
- protection type, just to give you a feeling for cracking, and I
- have chosen a widely published demo: you should be able to find
- it pretty easily. In order to show you some of the problems you
- may encounter we'll crack this example "wrongly" (you'll learn
- how to crack effectively in the "HANDS ON" lessons).
- EXAMPLE: ARCADE POOL, Demonstration version, PC Conversion
- by East Point Software Ltd, (c) Team 17 Software Ltd 1994. This
- demo has been published by many magazines on their CDRom covers
- throughout 1995.
- What follows will be useful even if you do not have our
- example; nevertheless you should get a copy of this widespread
- demo in order to better grasp some of the following points.
- This nice demo of a billiard game is time-crippled. It is
- crippled on how long you use it: i.e., you can only play 2
- minutes, afterwards a "nag" reminder of where and how you can buy
- the real version snaps: protectionist squalor at its best.
- So, how do you proceed? Where does the beginning begin?
- Here is what you could (but not necessarily should) do:
-
- Get [Soft-ice] and load it in your config.sys. See the TOOLS
- OF THE TRADE lesson (-> LESSON 2) about this debugger. Version
- 2.6 of [Soft-Ice] has been cracked by MARQUIS DE SOIREE and can
- be found on the Web for free.
- - vecs s (save all the vectors before loading the babe)
- - start [pooldemo.exe]
- - vecs c (vector compare, save a printing of all hooked
- vectors)
- - enter and leave Soft-ice a few times to understand what's
- going on and where in [pooldemo.exe] are we roaming around
- (you should always check MORE THAN ONCE your findings when
- you snoop around: nothing moves and confuses pointers in a
- more frenzied way than good old "inactive" DOS).
- - have a good look at the map of memory usage ("map")
- - now "snap_save" the main memory regions where
- [pooldemo.exe] dwells... snapping saves "photographs" of
- memory areas.
- - do not do anything, let just the seconds go by.
- - "snap_compare" every two or three seconds without moving
- anything at all on the game board (no mouse_clicking,
- NOTHING), so that the only changes are (hopefully) the
- changes caused by the time counters.
- - snap_compare twice in a second.
- - snap_compare at second 00:59 and at second 1:01.
- - snap_compare just before and just after the time limit and
- the snapping of the nag screen.
- - Now collect carefully your printed "snaps" data: write
- clearly on the various sheets the occurrences of the snaps.
- - now comes the graceful "zen-cracking" moment: Sit down with
- a dry Martini and Wodka (obviously only russian Wodka will
- do) and contemplate the printing of the various mutant
- locations. Feel, perceive, empathize! Look closely at the
- locations that have changed in the snap compares. Analyze,
- interpretate, evaluate.
- - Mmm! Hey! Something fishy is changing there, and there, and
- there! (you are lucky, few do actually change in this case:
- only two dozen)
- - breakpoint on execute at the location that you believe act
- as a "continuous" counter, i.e. the location that triggers
- the "a second went by" event when it zeroes.
- - Now set the occurrence counter of BPX in order to break at
- the moment where the location "refills" and restarts from
- the beginning (the equivalent of "one second" went by,
- let's start anew). Use the occurrence counter in order not
- to single-step through the program your life long!
- - IN THIS CASE you 'll quickly locate the refill at location
- 3DD0. Here follows the "refill" line:
- xxxx:3DCC C706F1013C00 MOV WORD PTR [01F1], 003C
- The "3C" byte at xxxx:3DD0 represents a counter_byte... i.e. the
- program "charges" 3C in this location and then DECs it step by
- step to 3B, 3A, 39, 38 etc... till 0. When it reaches 0: bingo!
- Sucker user has lost one second more of his precious two minutes.
- Now, you would get a first wizard level if you searched
- further on for the exact point where you get the "nag screen" in
- order to eliminate the whole witless protection, but you may
- think you got it already and you remember anyway that the first
- principle in cracking is the following: "once you can eliminate
- the effects of a protection, do not look further!"
- Most of the time this is true: you do not always need to
- eliminate a "whole" protection scheme (unless you are just
- studying it for the joy of it). It's normally easier (and
- quicker) to eliminate the "effects" of a given protection scheme.
- Unfortunately this is not true in this case.
- Here you believe that you have already found the way: you
- got the counter that charges the reverse clock that triggers the
- particular protection scheme of [pooldemo.exe]. Now you may think
- that if you could modify the refill_value... say changing "3C"
- to "EE" (Yeah, the maximum would be FF... but it's always good
- practice to avoid such extreme values when cracking) you should
- get four times more playtime for your game... more than enough
- in order to make the protection scheme useless.
- So you change location xxxx:3DD0 from "3C" to "EE". To work
- on bytes you should use a good Hexeditor like PSEDIT (Parity
- solutions, [Psedit.exe], brilliant shareware: see the "tool of
- the trade" section) but you could also work with simpler
- debuggers like [debug] or [symdeb] (-> see lesson 2). If you do,
- remember to work on a "dead" copy of your crippled [*.exe] file,
- i.e.:
- ren POOLDEMO.EXE POOLDEMO.DED
- symdeb POOLDEMO.DED
- -s (cs+0000):0 Lffff C7 06 F1 01 C3 <- this string
- corresponds to the
- refill line).
- cs:3E85 <- symdeb gives you two locations as answer
- cs:3EEA
- -e cs:3E85+4 EE <- refill changed from C3 to EE
- -w
- ren POOLDEMO.DED POOLDEMO.EXE
- Now you run your tampered pooldemo. You think you cracked it, you
- glee with satisfaction... but loo! Nothing at all has changed,
- everything's as lame as before, you still have only 2 minutes
- playtime. How disappointing: how comez it didn't work?
- Well, for a start you have not been attentive enough! The
- search in debug gave you TWO locations, you moron, and not just
- the one you just tampered with. Check and you 'll see that the
- second location (cs:3EEA) is a MIRROR/CONTROL location (more on
- this later). Some times there exist "double" locations... coz at
- times it's quicker to use a double routine than to use a
- branching if or switch structure... some times the second
- locations do mirror the first ones and correct them on the fly
- if need be.
- So you need to modify this too... you act as said above but
- this time you enter in debug a
- -e cs:3EEA+4 EE
- before writing back the dead file and then renaming it to exe and
- then running it... and loo! Hoow sloow! THERE YOU ARE! Your
- crippled POOLDEMO.EXE is now (sort of) unprotected: You think
- that you can now play the stupid game up to 12 minutes real time,
- even if the protection scheme (and the counter) "believes" that
- it is playing only two minutes.
- So you begin to play, and the seconds look veeery sloow, and
- everything seems OK, but -alas- NO! At screen second 28 you get
- the irritating "two minutes are over" nag screen! Obviously you
- were dead wrong: the program "knows" the time directly from the
- timer... you only modified the stupid counter ON THE SCREEN.
- So it's back to cracking, and now you are angry, and forget
- the quiet ways of the zen-analyze and begin the heavy cracking
- you should reserve -if ever- for really complicated schemes. You
- now start to check the hooked vectors (you did your routinely
- VECS_save before loading pooldemo in [Soft-ice] and your
- VECS_compare afterwards) and you see some findings that you
- believe interesting:
- vecs c
- 08 1EFD:84C6 0CD1:17AC <- the clock
- 09 1EFD:85EC 136A:069C <- the keyboard
- 22 0BCE:02B1 0BCE:017E <- the terminate
- That's more like it -you think. Smack at the beginning: the
- first hooked vector does it! It's good old interrupt_08: the
- timer_clicker!
- Some basics for those of you that do not know anything:
- INT_08 controls indirectly the INT_1C timer interrupt. The 8253
- clock chip generates an IRQ_0 hardware interrupt at a rate of
- 18.2 interrupts per second. This gives control to the ISR
- (Interrupt Service Routine) that the INT_08 points to... and this
- should be at 0CD1:17AC, but has been hooked here, by pooldemo,
- to 1EFD:84C6.
- One of the actions taken by the INT_08 ISR within the BIOS
- is to issue a software interrupt call to INT_1C, just in case any
- software modules within the system have established an intercept.
- If no intercepts have been established, the default contents of
- the INT_1C vector point to an iret instruction within the BIOS,
- so that a null action results.
- Normally a protectionist would intercept INT_1C, coz at
- every ISR from INT_08 the CPU would fetch the contents of the
- corresponding interrupt vector and make an interrupt style call
- to the code at that address (which should contain the iret at
- address F000:9876 but can contain any trick they could think of).
- So -you think- the protectionist hooked here INT_08 directly
- (a pretty infrequently used protection scheme by the way): What
- now?
- A rather drastic measure would be, in such circumstances,
- to
- disable the IRQ_0 level timer interrupt, which is controlled by
- bit 0 of the mask register, at address I/O 0021h. When bit 0
- within the mask register is set to 1, no further interrupts will
- be recognized for this IRQ level. This unfortunately won't work
- here, but it's an interesting technique per se, so you better
- learn it anyway, just in case you should need it elsewhere:
-
- --- Trick to disable the timer ("IRQ_0 masking" by +ORC) ---
- * prompt $t and hit ENTER a few times, see how the dos_clock
- is merrily ticking along?
- * enter DEBUG.COM
- * Assemble using the command 'a'
- - a
- in al,21
- or al,1
- out 21,al
- ret
- RETURN
- RETURN <- twice to exit immediate assembler
- - g 100 <- to run the tiny program.
- - q <- to quit debug.
-
- prompt $t is still on: hit ENTER a few times:
- whoa! The clock has stopped advancing!
-
- Compliments: you loaded the current mask register's contents
- into AL, you set the mask bit in the bit 0 position (which
- corresponds to IRQ_0) at then updated the value back to the mask
- register.
-
- When you are ready to activate IRQ_0 events again, reenter DEBUG,
- run the following and then reset the clock you stopped with DOS
- TIME command:
- - a
- in al,21
- and al,fe
- out 21,al
- ret
- RETURN twice
- - g 100
- - q
-
- A word of caution: with the timer click disabled some processes
- will not operate correctly: once you access the diskette drive,
- the motor will continue to run indefinitely afterwards, etcetera.
- -------------------------------------------------------
-
- Unfortunately the above technique cannot work with our
- [pooldemo.exe], where you now are looking closely to the INT_08
- hook you found, believing that it hides the protection scheme:
- herein you find immediately the EoI (End_of_interrupt: MOV
- AL,20h... OUT 20h,AL). Both controllers have a second port
- address at 20h (or 0a0h), from which the instructions are given.
- The most important is the EoI command (20h). This instruction
- indicates the end of the interrupt handler and frees up the
- corresponding controller for the next interrupt. If somebody
- writes a new custom interrupt handler (as many protectionists
- do), it's up to him to see to it that at the end of the handler
- the EoI command (20h) is written to either port 20h or port 0a0h.
- After the EoI follow the usual pushes, then some CALLS then
- a call that issues some OUT 40,AL that look like timer refreshing
- (OUT transfers data to an output port and ports 40-42 correspond
- to the Timer/counter). Some do_maintenance follows, then a double
- CALL, one more conditional CALL and then a "mysterious" call FAR
- CS:[AA91] on which depends a byte PTR[970C] that decides another
- final CALL... then the routine pops all registers and irets away.
- Ah! You say, and begin disassembling, reverse engineering
- and looking inside each suspect call (the quicker method in
- these cases is to breakpoint calls on entrance and see if you
- find the one that's only called at the awakening of the time
- limit protection).
- You work, and work, and work... and eventually find nothing
- at all, coz the protection of this program is NOT HERE!
-
- Back to the zen-analyze of the snap printings... we forsake
- it too soon, as you will see.
- If you watch with more attention the compare locations for
- the range DS:0 DS:FFFF you 'll notice that one of them changes
- relatively slowly from 0 to 1 to 2 to 3 and so on... the
- precedent location changes very quickly, and runs the complete
- cycle 0...FF. That's a counter, at locations DS:0009 and DS:000A!
- How long will it tick along? Well, we saw above that the "charge"
- every second is 3C, so it will be x3C*x78=x1C20, coz x78 is 120
- seconds, i.e. the two minutes time limit.
- Now search this 1C20 value around inside the code
- (protections are most of the time at the beginning of the
- CS:offset section), and you 'll find quickly what follows:
- The protection in [pooldemo.exe] is at code_locations
-
- CS:0A8A 813E20A7201C CMP WORD PTR [A720], 1C20
- compare location A720 with limit 1C20
- CS:0A90 7C07 JL okay_play_a_little_more
- CS:0A92 E834FD CALL beggar_off_time_is_up
-
- BINGO!: FOUND!
-
- Now let's quickly crack it:
- ------------------------------------------------
- CRACKING POOLDEMO.EXE (by +ORC, January 1996)
-
- ren pooldemo.exe pooldemo.ded
- symdeb pooldemo.ded
- - s cs:0 Lffff 81 3E 20 A7 20 1C
- xxxx:yyyy <- this is the answer of the debugger
- - e xxxx:yyyy+5 4C <- this time limit is much better
- - w
- - q
- ren pooldemo.ded pooldemo.exe
- -------------------------------------------------
- We have done here a "weak" crack: we limited ourselves to
- accept a (better) time limit, changing it from 1C20 to 4C20 (4
- minutes instead of two). We could obviously have done a more
- radical crack if we had changed the JL (jump lower) instruction
- in a JMP (jump anyway) instruction. In this case it would have
- worked, but for reasons that will be explained in lesson 4, you
- should choose a rather delicate approach in cracking when you
- deal with time-limit protection schemes.
- As you have seen, in this artificial cracking session we
- found the protection scheme after a little snooping around. But,
- as you will see in the hands on part, there are always MANY ways
- to crack a single protection scheme. You could -for instance-
- have found this protection the other way round: set a trace on
- memory range for the program, restricting the trace to the first
- part of it (say CS:0 to CS:1000, if you do not fetch anything you
- can always try the other blocks). Breakpoint at the nag screen,
- have a look at the last 300-400 backtraced instructions, if you
- did not move anything, everything will follow a repetitive
- pattern, until the protection snaps on:
- ...
- JL 0A99
- CMP BYTE PTR [A72A],01
- ...
- JL 0A99
- CMP BYTE PTR [A72A],01
- ...
- for ages and ages and then...
- ...
- JL 0A99
- E834FD CALL 0759 <- BINGO! (CALL beggar_off_time_is_up)
-
- ... there it is, found the other way round. (But this apparently
- better method is unfortunately very unstable: it depends on your
- timing of the breaking in and on the distance between protection
- and nag screen, therefore the somehow more complicated, but more
- sure previous one should be favoured).
- The reason why "minimal" approaches in cracking are often
- more successful than heavy vector_cracking, is that the programs
- are hardly ever "overprotected", and therefore the protections
- are seldom difficult to find (and those that are really worth
- cracking for study reasons).
- Sometime you don't even need to crack anything at all! Some
- applications are fully functional -per se-, but have been
- crippled in a hurry in order to release them as demos. The
- commercial programmers want only money, do not even try to
- understand our zen ways, and do not care at all for a well done
- job. That means, among other things, that the hard disk of the
- user will be cluttered with files that the main program module
- never calls. A typical example of this sloppy method is the demo
- of [Panzer General] from SSI that appeared in the summer '95.
- This was in reality no less than the complete beta version of the
- game: you just had to substitute to one of the two "allowed"
- scenarios one of the 20 or more scenarios of the beta version in
- order to play them freely... you didn't ever need to crack!
- The pooldemo crack example above should not discourage you
- from cracking intuitively. Be careful! Perform a thoroughly
- zen_analyze before attempting deeper methods: do remember that
- you want to crack the protection scheme SOMEHOW, and not
- necessarily following the same line of thought that the
- programmer eventually WANTED YOU TO CRACK IT with.
-
- Well, that's it for this lesson, reader. Not all lessons of my
- tutorial are on the Web.
-
- You 'll obtain the missing lessons IF AND ONLY IF you mail
- me back (via anon.penet.fi) with some tricks of the trade I may
- not know that YOU discovered. Mostly I'll actually know them
- already, but if they are really new you'll be given full credit,
- and even if they are not, should I judge that you "rediscovered"
- them with your work, or that you actually did good work on them,
- I'll send you the remaining lessons nevertheless. Your
- suggestions and critics on the whole crap I wrote are also
- welcomed.
-
- E-mail +ORC
-
- +ORC an526164@anon.penet.fi
-